"""
- 什么是闭包
1. 定义双层嵌套函数，内层函数可以访问外层函数的变量
2. 将内层函数作为外层函数的返回，此内层函数就是闭包函数
=============================================================
- 闭包的好处和缺点
1. 优点：不定义全局变量，也可以让函数持续访问和修改一个外部变量
2. 优点：闭包函数引用的外部变量，是外部函数的内部变量，作用域封闭难以被误操作修改
3. 缺点：额外占用内存
=============================================================
- nonlocal 关键字的作用
使用nonlocal这个关键字去修饰外部函数的变量才能在内部函数中修改它，即修改外部变量
"""


def account_create(initial_amount=0):
    def atm(num, deposit=True):
        # 使用nonlocal这个关键字去修饰外部函数的变量才能在内部函数中修改它，即修改外部变量
        nonlocal initial_amount
        if deposit:
            initial_amount += num
            print(f"存款：+{num},账户余额：{initial_amount}")
        else:
            initial_amount -= num
            print(f"存款：-{num},账户余额：{initial_amount}")

    return atm


atm = account_create()
atm(300)
atm(300)
atm(100, False)

atm1 = account_create()
atm1(300)


def outer(logo):
    def inner(msg):
        print(f"<{logo}><{msg}><{logo}>")

    return inner


func1 = outer("黑马程序员")
func1("大家好")
func2 = outer("传智教育")
func2("大家好")
